home *** CD-ROM | disk | FTP | other *** search
- * ワイプライブラリ読み込み
- *
- * in : d0.l = 検索モード
- * bit0 = 1 : カレントディレクトリから検索
- * bit1 = 1 : 自分自身のパスからも検索
- * bit2 = 1 : 環境変数 WL_path からも検索
- * a0.l = ワイプライブラリ名
- *
- * out : d0.l = 0 ; 読み込み成功
- * =-1 ; 読み込みエラー
- * =-2 ; メモリ不足
- * =-3 ; ワイプライブラリでは無い
- * d1.l = ワイプライブラリの最高速度
- * a0.l = ワイプライブラリのメモリブロック
- * a1.l = 〃 のプログラム部分のアドレス
- *
- * 備考 : スタックを 400 bytes 程度消費します
- * また、DOS _GETENV を使っているため、スーパーバイザモードで
- * 呼び出す時は Human68K のバージョンに注意して下さい
- * ( ver3 の DOS コール移動の件)
- *
- * バージョンアップ履歴
- * 97/04/10 : 初版
- * 97/07/11 : DOS _EXEC でワイプライブラリを読むようにした(キャッシュ対策)
- * 副作用で LZX で圧縮した .WL も使えるようになった(要 LZXLOADER.SYS)
- * コメントスキップで2バイト文字も考慮するようにした
-
- .include DOSCALL.MAC
-
- .xdef wl_load
-
-
- .offset -92 * スタック上のワーク
- work_path:
- .ds.b 92
-
-
- .text
- .even
- wl_load:
- link a6,#work_path
- movem.l d2-d7/a2-a5,-(sp)
-
- move.l d0,d2 * d2.l = 検索モード
- movea.l a0,a3 * a3.l = ワイプライブラリ名
-
-
- move.l #-1,-(sp)
- DOS _MALLOC
- addq.w #4,sp
- andi.l #$00fffffe,d0
- move.l d0,a4 * a4.l = 確保できるメモリサイズ
- move.l d0,-(sp)
- DOS _MALLOC
- addq.w #4,sp
- tst.l d0
- bmi less_mem_err
- move.l d0,a2 * a2.l = ワイプライブラリを読み込むアドレス
-
-
- **** ****
- btst.l #0,d2 * カレントディレクトリから検索するか?
- beq not_current
-
- * 渡されたファイル名そのままでオープン
- bsr open
- bpl comment_check
- * 拡張子 '.WL' をつけてもう一度オープン
- lea.l work_path(a6),a0
- bsr copy_fname
- bsr copy_ext
- lea.l work_path(a6),a0
- bsr open
- bpl comment_check
- not_current:
-
-
- btst.l #1,d2 * 自分自身のパスから検索するか?
- beq not_my_path
-
- * 自分自身のパス名を付けてもう一度オープン
- lea.l work_path(a6),a0
- bsr copy_my_path
- bsr copy_fname
- lea.l work_path(a6),a0
- bsr open
- bpl comment_check
- * 自分自身のパス名と拡張子 '.WL' をつけてもう一度オープン
- lea.l work_path(a6),a0
- bsr copy_my_path
- bsr copy_fname
- bsr copy_ext
- lea.l work_path(a6),a0
- bsr open
- bpl comment_check
- not_my_path:
-
-
- btst.l #2,d2 * 環境変数の指すパスから検索するか?
- beq open_err
-
- * 環境変数の指すパス名を付けてもう一度オープン
- lea.l work_path(a6),a0
- bsr copy_env
- bsr copy_fname
- lea.l work_path(a6),a0
- bsr open
- bpl comment_check
- * 環境変数の指すパス名と拡張子 '.WL' をつけてもう一度オープン
- lea.l work_path(a6),a0
- bsr copy_env
- bsr copy_fname
- bsr copy_ext
- lea.l work_path(a6),a0
- bsr open
- bpl comment_check
- bmi open_err
-
-
- **** ****
- comment_check:
- move.l d0,d6 * d6.l = ファイルサイズ
-
- * 最大限確保したメモリブロックを切り詰める
- move.l d6,-(sp)
- pea.l (a2)
- DOS _SETBLOCK
- addq.w #8,sp
-
-
- movea.l a2,a1
-
- cmpi.l #'WL10',(a1)+ * ヘッダ 'WL10' をチェック
- bne not_wl_err
- comment_skip_loop:
- move.b (a1)+,d0 * d0.b = 1文字読む
- bpl is_半角 * $00-$7f は半角
- cmpi.b #$a0,d0
- bcs @f
- cmpi.b #$df,d0 * $a0-$df は半角
- bls is_半角
- @@: cmpi.b #$80,d0
- beq is_2バイト半角 * $80xx は2バイト半角
- cmpi.b #$f0,d0
- bcs is_全角
- cmpi.b #$f3,d0
- bls is_2バイト半角 * $f0xx-$f3xx は2バイト半角
- is_全角:
- is_2バイト半角:
- addq.w #1,a1 * 2バイト文字の2バイト目は読み捨てる
- bra comment_skip_loop
-
- is_半角:
- cmpi.b #$1a,d0 * コメントをスキップ
- bne comment_skip_loop
-
-
- move.l a1,d0 * コメントの後の
- addq.l #1,d0 * .even を補正
- lsr.l d0
- lsl.l d0
- movea.l d0,a1 * a1.l = プログラム部分のアドレス(返り値)
-
- move.l #-1,-(sp) * ワイプ速度問い合わせ
- clr.l -(sp) * ダミー
- clr.l -(sp) * ダミー
- jsr (a1)
- lea.l 12(sp),sp
- move.l d0,d1 * d1.l = 速度最高値(返り値)
-
- moveq.l #0,d0 * d0.l = エラーコード(返り値)
- load_rts:
- movea.l a2,a0 * a0.l = メモリブロック(返り値)
- movem.l (sp)+,d2-d7/a2-a5
- unlk a6
- rts
-
-
- **** ****
- open: * in : a0.l = ファイル名
- * a2.l = 読み込むアドレス
- * a4.l = ↑のメモリブロックの大きさ
- move.l a2,d0
- add.l a4,d0
- move.l d0,-(sp) * リミットアドレス
- pea.l (a2) * ロードアドレス
- pea.l (a0) * ファイル名
- move.b #1,(sp) * .R 形式としてロード
- move.w #3,-(sp) * MD
- DOS _EXEC
- lea.l 14(sp),sp
- tst.l d0
- rts
-
-
- copy_fname: * スタック上にワイプライブラリ名をコピー
- * out : a0.l = コピー先の次のアドレス
- movem.l a1,-(sp)
-
- movea.l a3,a1
- @@: move.b (a1)+,(a0)+
- bne @b
- subq.w #1,a0
-
- movem.l (sp)+,a1
- rts
-
-
- copy_ext: * 拡張子 '.WL' をコピー
- * out : a0.l = コピー先の次のアドレス
- move.b #'.',(a0)+
- move.b #'W',(a0)+
- move.b #'L',(a0)+
- clr.b (a0)+
- rts
-
-
- copy_my_path: * 自分自身のパス名をコピー
- * out : a0.l = コピー先の次のアドレス
- movem.l a1,-(sp)
-
- DOS _GETPDB
- movea.l d0,a1
- adda.w #$80-$10,a1 * a1.l = 自分自身のパス
- @@: move.b (a1)+,(a0)+
- bne @b
- subq.w #1,a0
-
- movem.l (sp)+,a1
- rts
-
-
- copy_env: * 環境変数の指すパス名をコピー
- * out : a0.l = コピー先の次のアドレス
- link a6,#-256
- movem.l a1,-(sp)
-
- pea.l -256(a6)
- clr.l -(sp)
- pea.l WL_path_strZ(pc)
- DOS _GETENV
- lea.l 12(sp),sp
- tst.l d0
- bmi copy_env_rts
-
- moveq.l #90-1,d0
- lea.l -256(a6),a1
- @@: move.b (a1)+,(a0)+
- dbeq d0,@b
- subq.w #1,a0
-
- moveq.l #0,d0
- copy_env_rts:
- movem.l (sp)+,a1
- unlk a6
- rts
-
-
- **** ****
- open_err:
- moveq.l #-1,d0
- bra load_rts
-
- less_mem_err:
- moveq.l #-2,d0
- bra load_rts
-
- not_wl_err:
- moveq.l #-3,d0
- bra load_rts
-
-
- **** ****
- WL_path_strZ:
- .dc.b 'WL_path',0
-
- .even